package com.sy.core.ActiveMq;

import com.sy.core.web.BaseCtl;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import java.io.IOException;
import java.util.Map;

@Component
public class ActiveMqConsumer extends BaseCtl {
    /**
     * 产品新增或修改变动监听,同时向solr服务器发送变动
     */
    @JmsListener(destination = "${productQueue}",containerFactory = "jmsQueueListener")
    public void productAddAndEditReceiver(TextMessage textMessage, Session session){
        try {
            logger.info("接收消息成功：" + textMessage.getText());
            String pk = textMessage.getText();
            Map<String, Object> product = productService.queryOne(pk);
            SolrInputDocument sid = new SolrInputDocument();
            sid.setField("id", product.get("pk"));
            sid.setField("item_name", product.get("product_name"));
            sid.setField("item_title", product.get("product_title"));
            sid.setField("item_price", product.get("product_price"));
            sid.setField("item_image", product.get("product_avatar"));
            sid.setField("item_sale", product.get("product_sale"));
            sid.setField("item_type", product.get("is_new"));
            solrClient.add("shinyoukeji", sid);
            solrClient.commit("shinyoukeji");
            textMessage.acknowledge();//使用手动签收模式，需要手动的调用，如果不在catch中调用session.recover()消息只会在重启服务后重发
        }catch (JMSException e) {
                logger.error("接收消息失败");
                logger.error(e.toString());
            try {
                session.recover();// 此不可省略 重发信息使用
            } catch (JMSException e1) {
                logger.error(e1.toString());
                logger.error("重发消息失败");
            }
        } catch (Exception e) {
            logger.error("同步solr数据库失败");
            logger.error(e.toString());
            try {
                session.recover();// 此不可省略 重发信息使用
            } catch (JMSException e1) {
                logger.error(e1.toString());
                logger.error("重发消息失败");
            }
        }
    }

    /**
     * 产品删除的时候同步到solr
     */
    @JmsListener(destination = "${productDeleteQueue}",containerFactory = "jmsQueueListener")
    public void productDeleteReceiver(TextMessage textMessage, Session session){
        try {
            logger.info("接收消息成功：" + textMessage.getText());
            String[] pks = textMessage.getText().split(",");
            for (int i = 0; i <pks.length ; i++) {
                solrClient.deleteById("shinyoukeji",pks[i]);
            }
            solrClient.commit("shinyoukeji");
        } catch (JMSException e) {
            logger.error("接收消息失败");
            logger.error(e.toString());
            try {
                session.recover();// 此不可省略 重发信息使用
            } catch (JMSException e1) {
                logger.error(e1.toString());
                logger.error("重发消息失败");
            }
        } catch (Exception e) {
            logger.error("同步solr数据库失败");
            logger.error(e.toString());
            try {
                session.recover();// 此不可省略 重发信息使用
            } catch (JMSException e1) {
                logger.error(e1.toString());
                logger.error("重发消息失败");
            }
        }

    }
}
